/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sni.org.pe.utilitario;

/**
 *
 * @author Ericson
 */
import java.io.Serializable;

import java.sql.Timestamp;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;

public class Fecha extends Date implements Serializable {

    public static final String FORMATO_MM_DD_AA;
    public static final String FORMATO_MM_DD_AA_HH_MIN;
    public static final String FORMATO_DD_MM_AA_HH_MM_SS;
    public static final String FORMATO_HH_MIN;
    public static final long MILISEGUNDOS_DIA;
    public static final int ANIO;
    static {
        FORMATO_MM_DD_AA = "dd/MM/yyyy";
        FORMATO_MM_DD_AA_HH_MIN = "dd/MM/yyyy h:mm a";
        FORMATO_DD_MM_AA_HH_MM_SS = "dd/MM/yyyy hh:mm:ss";
        FORMATO_HH_MIN = "h:mm a";
        MILISEGUNDOS_DIA = 86400000;
        ANIO = 365;
    }

    private Date fecha;


    public Fecha() {
        super();
        fecha = new Date();
    }


    public Date getFecha() {
        return fecha;
    }

    public void setFecha(Date fecha) {
        this.fecha = fecha;
    }

    public Timestamp getTimeStamp() {

        return new Timestamp(fecha.getTime());
    }

    public String getFechaActual(String pattern) {
        SimpleDateFormat spd = new SimpleDateFormat(pattern);
        return spd.format(fecha);
    }

    public String toString(Date date, String pattern) {
        if (date != null) {
            SimpleDateFormat spd = new SimpleDateFormat(pattern);
            return spd.format(date);
        } else {
            return null;
        }

    }

    public void subFechaActual(int numeroDias) {
        long timeDias = numeroDias * 3600 * 1000 * 24;
        long timeReal = fecha.getTime() - timeDias;
        fecha.setTime(timeReal);
    }

    public String getHoraIngreso() {
        SimpleDateFormat spd = new SimpleDateFormat(FORMATO_HH_MIN);
        return spd.format(new Date());
    }

    public String getFechaLiteral() {
        Date da = new Date();
        GregorianCalendar gc = new GregorianCalendar();
        Locale local = new Locale("ES");
        gc.setTime(da);
        StringBuffer sb = new StringBuffer();
        sb.append("Lima, ".toUpperCase());
        sb.append(gc.getDisplayName(GregorianCalendar.DAY_OF_WEEK, GregorianCalendar.LONG, local).toUpperCase());
        sb.append(" ");
        sb.append(da.getDate());
        sb.append(" de ".toUpperCase());
        sb.append(gc.getDisplayName(GregorianCalendar.MONTH, GregorianCalendar.LONG, local).toUpperCase());
        sb.append(" del ".toUpperCase());
        sb.append((da.getYear() + 1900));
        return sb.toString();
    }

    public Timestamp obtenerTimeStamp(Date fech) {
        try {
            return new Timestamp(fech.getTime());

        } catch (Exception e) {
            System.out.println("Exception :" + e);
            return null;
        }

    }

    public Date obtenerFechaInicial() {
        try {
            DateFormat formatter;
            Date date;
            Calendar c = new GregorianCalendar();
            String str_date = "01/01/" + c.get(Calendar.YEAR);
            formatter = new SimpleDateFormat("dd/MM/yyyy");
            date = (Date)formatter.parse(str_date);
            return date;
        } catch (ParseException e) {
            System.out.println("Exception :" + e);
            return null;
        }

    }

    public String obtenerFechaFinal() {
        Calendar c = new GregorianCalendar();
        String str_date = "31/12/" + c.get(Calendar.YEAR);

        return str_date;
    }

    public Date sumarDias(Date fechaInicio, int numeroDias) {
        if (fechaInicio != null) {
            Date date = fechaInicio;
            long cantMili = date.getTime();
            cantMili += (numeroDias * MILISEGUNDOS_DIA);
            return new Date(cantMili);
        } else {
            return null;
        }
    }

    public Date restarDias(Date fechaInicio, int numeroDias) {
        Date date = fechaInicio;
        long cantMili = date.getTime();
        cantMili -= (numeroDias * MILISEGUNDOS_DIA);
        return new Date(cantMili);
    }
    public String getFechaToString(String fecha) {
        //Fecha ingresada en formato yyyy-mm-dd hh:mm:ss
        String anio = fecha.substring(0, 4);
        String mes = fecha.substring(5, 7);
        String dia = fecha.substring(8, 10);
        return dia + "-" + mes + "-" + anio + " " + fecha.substring(11, 16);
    }

    public static String parseDate(String date, String pattern) {
        //Fri Sep 09 17:45:48 COT 2011
        DateFormat df = new SimpleDateFormat("d MMM yyyy HH:mm:ss G");
        Date dt = null;
        try {
            dt = df.parse(date);
            df = new SimpleDateFormat(pattern);
            return df.format(dt);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return "";
    }

    public static Timestamp toTimeStamp(String fecha, String pattern) {
        if (fecha != null && !fecha.equalsIgnoreCase("null")) {
            DateFormat df = new SimpleDateFormat(pattern);
            Date dt = null;
            try {
                dt = df.parse(fecha);
                return new Timestamp(dt.getTime());
            } catch (ParseException e) {
                e.printStackTrace();
                return null;
            }
        } else {
            return null;
        }
    }

    public static String TimestampoToString(Timestamp timestamp, String pattern) {
        String fecha = null;
        if (timestamp != null) {
            Date date = new Date(timestamp.getTime());
            DateFormat spdf = new SimpleDateFormat(pattern);
            fecha = spdf.format(date);
        }
        return fecha;
    }

    public static Date addMonth(Date date, int numeroMeses) {
        if (date != null) {
            Calendar c = Calendar.getInstance();
            c.setTime(date);
            c.add(Calendar.MONTH, numeroMeses);
            return c.getTime();
        } else {
            return null;
        }
    }
}

